package cn.edu.bjut.my.thinkinjava._20200414_rpc;

import java.io.IOException;
import java.net.InetSocketAddress;

/**
 * @author: admin
 * @create: 2019/05/18
 * 设计一个简单的rpc程序：
 * 1：客户端
 * 1.1 使用socket 连接服务端
 * 1.1.1 服务器地址、调用的服务名字与方法
 * 1.2 序列化
 * 1.3 等待服务器响应
 * 1.4 将本地接口调用换成jdk动态代理，在代理中实现接口调用
 * 2：服务端
 * 2.1 服务中心
 * 2.1.1 服务注册
 * 2.1.1.1 map存储
 * 2.1.1.2 注册方法与判断存在逻辑
 * 2.1.2 接收socker
 * 2.1.3 获取serverClass、method，调用
 * 2.1.4 序列化返回
 * 2.1.5 服务端使用线程 执行ServiceClass.method
 * 2.2 服务端服务
 */
public class RPCTest {
    public static void main(String[] args) throws IOException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Server serviceServer = new ServiceCenter(8082);
                    serviceServer.register(ServiceProducer.class, ServiceProducerImpl.class);
                    serviceServer.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                int i=0;
                do{
                    try {
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getId());

                    ServiceProducer service = RPCClient.getRemoteProxyObj(ServiceProducer.class, new InetSocketAddress("localhost", 8088));
                    System.out.println(service.sendData("test"));
                    i++;
                }while (i<10);

            }
        }).start();

    }
}
